package ru.iteco.Java.study.MSGR;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * Класс реализует поток прослушивающий порт CurrentPort
 */
public class PortListener implements Runnable{
	
	/**
	 * @param port - прослушиваемый порт
	 * @param fol - полученный из Connector обработчик события FromOut
	 */
	public PortListener(int port,FromOutsideListener fol) {
		this.port=port;
		try {
			ss=new ServerSocket(this.port);
		} catch (IOException e) {
			System.out.println("Error in PortListener!");
			e.printStackTrace();
		}
		this.fol=fol;
		fo=new FromOutside(fol);
	}
	
	/**
	 * вводит поток в состояние ожидания, пока не
	 * будет установлено соединение
	 * @return полученный сокет
	 */
	public Socket listen() {
		try {
			while(true)
			{
				s=ss.accept();
				fo.doEvent(s);
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			System.out.println("Error in PortListener.listen()");
			e.printStackTrace();
		}
		return s;
	}
	
	@Override
	public void run() {
		this.listen();
	}
	
	
	public int getPort() {
		return port;
	}
	
	/*public static void main(String[] args) {
		PortListener pl=new PortListener(7777,null);
		Socket s=pl.listen();
		System.out.println("Socket="+s);
		System.out.println("port="+s.getPort());
	}*/
	
	@Override
	protected void finalize() throws Throwable {
		ss.close();//серверный сокет для прослушивания порта
		super.finalize();
	}
	
	private ServerSocket ss;//сокет для прослушивания порта
	private Socket s;//полученный в результате сокет
	private int port;//прослушиваемый порт
	private FromOutside fo;//событие вызываемое врезультате принятия соединения
	@SuppressWarnings("unused")
	private FromOutsideListener fol;//ссылка на EventListener из Connector
}


